<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    call apply bind：修改this的指向 Function.prototype----》函数
    1. 函数.call(新this,参数1,参数2,参数3...)
    第一参数如果没有，会存在默认值,就是新this;后面参数可有可无，后面的参数都是给函数传递参数
    2. 函数.apply(新this,[参数1,参数2,参数3...])
    第一参数如果没有，会存在默认值,,就是新this;
    后面参数可有可无，格式是数组或类数组,后面的参数都是给函数传递参数
    3. 函数.bind(新this,参数1,参数2,参数3...) 不会执行函数，需要再添加一个小括号
    第一参数如果没有，会存在默认值,就是新this;后面参数可有可无，后面的参数都是给函数传递参数

    第一个参数默认值(后面的其他参数都不传)，指向 window(非严格) undefined(严格)
    第一个参数null/undefined 指向 window(非严格) null/undefined(严格)
    <script>
        // "use strict";
        // function show(n,m){
        //     console.log(this,n,m);
        // }
        // // show(10,20);
        // // show.call("aaa",100,200);
        // // show.apply("bbb",[101,202]);
        // // show.bind("aaa",300,400)();

        // show.call(null);


        // var arr=[44,55,11,22,33];
        // console.log(Math.max(...arr));//****


        // var arr=[44,55,11,22,33];

        // // Math.prototype.max=function max(){
        // //     //参数 10,20,30
        // //     //this--->Math

        // //     //返回最大值
        // // }
        // //Math.max(10,20,30)


        // console.log(Math.max.apply(Math,arr));
        // console.log(Math.max.apply(null,arr));


        // var arr=[44,55,11,22,33];
        // arr.sort((a,b)=>b-a);
        // console.log(arr[0]);


        // const fn1 = function fn1() {
        //     console.log(1);
        // };
        // const fn2 = function fn2() {
        //     console.log(2);
        // };

        // fn1.call(fn2); // fn1函数执行  this---fn2   1

        // fn1.call.call.call(fn2);//2
        // //两个及两个以上call---》“call方法”
        // //“call方法”.call(fn2)
        // //fn2.call()--- fn2函数执行  this---window
        // Function.prototype.call(fn2);
        // //Function.prototype本质是匿名空函数
        // //匿名空函数执行  this---fn2   什么也没有
        // Function.prototype.call.call.call(fn2);
        // //“call方法”.call(fn2)
        // //fn2.call()---fn2函数执行  this---window



        const fn1 = function fn1() {
            console.log(1,this,arguments);
        };
        const fn2 = function fn2() {
            console.log(2,this,arguments);
        };

        Function.prototype.call.call.call(fn2,10,20);
       //"call方法".call(fn2,10,20);
       //fn2.call(10,20);
       //fn2函数执行  this-->10   参数20
        

    </script>
</body>

</html>